package modele.coupSpecial;

import java.util.ArrayList;
import modele.Dessinable;
import modele.Plateau;
import modele.case_.Case;
import modele.pion.Pion;

/**
 * Représente un coup Spécial qu'un pion peut effectuer
 *
 * @author zianechm
 */
public abstract class CoupSpecial implements Dessinable {

	private boolean coupSpecialDispo;
	/**
	 * Détermine si l'on doit afficher les casesAffectees par le coup spécial
	 */
	protected boolean afficherCasesAffectees;
	/**
	 * Contient le pion qui effectue le coup spécial
	 */
	protected Pion lanceur;
	/**
	 * Contient la case ciblée par le coup spécial
	 */
	protected Case cible;

	/**
	 * Crée un coup spécial
	 */
	public CoupSpecial() {
		coupSpecialDispo = true;
		afficherCasesAffectees = false;
	}

	/**
	 * Défini le lanceur du coup spécial
	 *
	 * @param lanceur le Pion qui possède ce coup spécial
	 */
	public void setLanceur(Pion lanceur) {
		this.lanceur = lanceur;
	}

	/**
	 * Défini la cible du coup spécial
	 *
	 * @param cible Case qui va être ciblée par le coup spécial
	 */
	public void setCible(Case cible) {
		this.cible = cible;
	}

	/**
	 *
	 * @return vrai si le coup spécial est disponible, faux sinon
	 */
	public boolean isCoupSpecialDispo() {
		return coupSpecialDispo && lanceur.getDrapeau() == null;
	}

	/**
	 * Défini si le coup spécial est disponible
	 *
	 * @param coupSpeacialDispo
	 */
	public void setCoupSpecialDispo(boolean coupSpeacialDispo) {
		this.coupSpecialDispo = coupSpeacialDispo;
	}

	/**
	 *
	 * @return vrai si l'on doit afficher les cases affectées, faux sinon
	 */
	public boolean isAfficherCasesAffectees() {
		return afficherCasesAffectees;
	}

	/**
	 * Effectue l'action du coup spécial
	 *
	 * @param p
	 */
	public abstract void effectuerCoupSpecial(Plateau p);

	/**
	 *
	 * @param p le plateau de jeu
	 * @return les cases qui sont affectées par le coup spécial
	 */
	public abstract ArrayList<Case> porteeCoupSpecial(Plateau p);
}
